package com.proyecto1;

import java.io.IOException;
import java.net.MalformedURLException;

import com.facebook.android.DialogError;
import com.facebook.android.Facebook;
import com.facebook.android.FacebookError;
import com.facebook.android.Facebook.DialogListener;
import com.proyecto1.R;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.Toast;

public class PublicaFB extends Activity {
	
	//el id de la fanpage de happy dirty fingers
		private static final String FAN_PAGE_ID = "499868486720145";
		
		//el id de nuestra aplicacion en facebook developers
		private static final String APP_ID = "245060688953851";
		
		/*los permisos de la aplicacion para facebook, especificamente para publish_stream tenemos:
		 * Posting to a friend's feed, Posting questions, Creating notes, Posting content to events or groups
		 * */
		private static final String[] PERMISSIONS = new String[] {"publish_stream"};
		
		//el token de acceso del login de cada usuario
		private static final String TOKEN = "access_token";
		
		//el tiempo de expiracion de los datos de autenticacion
	    private static final String EXPIRA = "expires_in";
	    
	    private static final String CLAVE = "facebook-credentials";

		private Facebook facebook;
		private String msgPunteo;

		//el metodo que guarda el usuario y contraseña del jugador, de su cuenta de facebook
		public boolean guardarCredenciales(Facebook facebook) {
			Editor editor = getApplicationContext().getSharedPreferences(CLAVE, Context.MODE_PRIVATE).edit();
	        editor.putString(TOKEN, facebook.getAccessToken());
	        editor.putLong(EXPIRA, facebook.getAccessExpires());
	        return editor.commit();
	    }
		
		//cuando vuelve a jugar no se le piden de nuevo sus datos, se obtienen de donde fue guardado
		//del metodo de arriba(shared preferences)
		public boolean restoreCredentials(Facebook facebook) {
	    	SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences(CLAVE, Context.MODE_PRIVATE);
	    	facebook.setAccessToken(sharedPreferences.getString(TOKEN, null));
	    	facebook.setAccessExpires(sharedPreferences.getLong(EXPIRA, 0));
	    	
	    	return facebook.isSessionValid();
		}
		
		//para cerrar la sesion del usuario actual en facebook, elimino las shared preferences lo que invalida
		//el objeto facebook
		public void removeCredentials(Facebook facebook){
			SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences(CLAVE, Context.MODE_PRIVATE);
			sharedPreferences.edit().clear().commit();
		}

	    @Override
	    public void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        
	        facebook = new Facebook(APP_ID);
			restoreCredentials(facebook);

			requestWindowFeature(Window.FEATURE_NO_TITLE);
	        
	        setContentView(R.layout.publicafb);

			String facebookMessage = getIntent().getStringExtra("facebookMessage");
			if (facebookMessage == null){
				facebookMessage = "mensaje de prueba";
			}
			msgPunteo = facebookMessage;
			
			String flag = getIntent().getStringExtra("status");
			if(flag.equals("postlog")){//postear en el muro
				if (!facebook.isSessionValid()) {
					loginYPostFB();
				}else {
					postFB(msgPunteo);
				}
			}else if(flag.equals("logout")){//cerrar sesion
				if (facebook.isSessionValid()) {//la sesion es valida, intento cerrar
					removeCredentials(facebook);
					showToast("Se ha cerrado sesion exitosamente.");
					finish();
				}else {
					showToast("No estaba autenticado en facebook, ERROR");
				}
			}
	    }
	    
	    
		public void compartirPostFB(View button){
			if (! facebook.isSessionValid()) {
				loginYPostFB();
			}
			else {
				postFB(msgPunteo);
			}
		}
		
		public void loginYPostFB(){
			 facebook.authorize(this, PERMISSIONS, Facebook.FORCE_DIALOG_AUTH, new LoginDialogListener());
		}

		public void postFB(String message){
			Bundle parameters = new Bundle();
	        parameters.putString("message", message);
	        parameters.putString("target_id", FAN_PAGE_ID);
	        
	        try {
	        	facebook.request("me");
	        	//poster en la fanpage de happy dirty fingers
				String response = facebook.request(FAN_PAGE_ID+"/feed", parameters, "POST");
				/* para postear en el muro de un usuario:
				   String response = facebook.request("me/feed", parameters, "POST");*/
				
				Log.d("Tests", "got response: " + response);
				
				if (response == null || response.equals("") || response.equals("false")) {
					showToast("No tienes punteo?? ERROR");
				}else {
					showToast("Hemos publicado tu punteo final!!");
				}
				finish();
			} catch (Exception e) {
				showToast("Algo a fallado al intentar publicar tu punteo. Lo sentimos");
				e.printStackTrace();
				finish();
			}
		}

		//la clase que tiene el login de facebook (implementacion de ellos)
		class LoginDialogListener implements DialogListener {
			
			//cuando terminamos de ingresar nuestro usuario y contraseña y damos clic al boton login
			//viene a ejecutarse este metodo
		    public void onComplete(Bundle values) {
		    	guardarCredenciales(facebook);//guardar los datos ingresados
		    	if (msgPunteo != null){
		    		postFB(msgPunteo);//ir a postear el punteo
		    	}
		    }
		    
		    public void onFacebookError(FacebookError error) {
		    	showToast("La autenticacion en facebook ha fallado");
		        finish();
		    }
		    public void onError(DialogError error) {
		    	showToast("La autenticacion en facebook tiene errores");
		        finish();
		    }
		    public void onCancel() {
		    	showToast("Cancelada la autenticacion!");
		        finish();
		    }
		}

		private void showToast(String message){
			Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
		}

}
